perm filename GAR50.FAI[LCS,MUS] blob
sn#007386 filedate 1971-12-30 generic text, type T, neo UTF8
TITLE Gardsk; DOROTHY BENDER
; ******* GAR50 ********
; ROUTINE TO READ THE OUTPUT FROM THE MUSIC
; PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;
; THE NAME OF THE FILE TO BE INPUTTED IS 'MUSIC',
; THE FIRST RECORD OF WHICH CONTAINS THE
; NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
A ← 1 ;WORK
B ← 2 ;WORK
N←4
FB←5
TMP←7
SEC←6
RET ← 3 ;RETURN ACCUMULATOR
BUFSIZ ←=10*2000 ;19 K PER BUFFER.
BANDSZ←=1280 ;SECTORS PER BAND
↓DSKCHN ←1 ;DISK CHANNEL FOR INPUT
↓ADCHN ←2 ;D-A CHANNEL FOR OUTPUT
OPDEF FBWRT [707B8]
OPDEF FBREAD [706B8]
OPDEF READCH [51B8]
OPDEF MESSAGE[51B8!3B12]
BEG: CALLI 0,0 ;RESET I/O DEVICES
OPEN DSKCHN,[17 ;MODE
'DSK ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
HALT BEG ;RESTART IF DEVICE IS UNAVAILABLE
SETZM FILBLK+3 ;FOR RESTART
LX: MESSAGE [ASCIZ/
TYPE `P' TO PLAY FROM DISK, `C' TO COPY TAPE TO DISK.
/]
readch a
cain a,"C"
jrst start
caie a,"P"
jrst lx
skipe filblk+3 ;is this first time through ?
jrst pla3 ;No. Parameters already set up.
;FIND OUT NUMBER OF CHANNELS AND
;THE SPEED.
MESSAGE [ASCIZ/HOW MANY CHANNELS?/]
READCH A
SUBI A,"0"+1 ;CONVERT TO BINR AND ADD 1
DPB A,[POINT 2,OUTBIT,26]
MESSAGE [ASCIZ/WHAT IS THE SPEED?/]
READCH A
SUBI A,"0"
DPB A,[POINT 3,OUTBIT,32]
PLA2: SETZM FILBLK+3
SETZM FILBL2+3
LOOKUP DSKCHN,FILBLK
SKIPA
JRST XOPEN
LOOKUP DSKCHN, FILBL2
JRST [MESSAGE[ASCIZ/
***FILE 'MUSIC' NOT FOUND/]
CALLI 12]
;EXIT IF FILE IS MISSING
MOVE A, FILBL2+3
MOVEM A, FILBLK+3
XOPEN: movs n,filblk+3 ;get length of file.
movnm n,nwd
movei fb,0 ;Start with logical band no. 0.
plx: movei sec,0
MOVE TMP,FB
calli TMP,400010 ;Get a fastband.
halt
ply: input dskchn,[iowd bufsiz,buf1
0]
movem sec,plzz
fbwrt fb,[ buf1 ;Write out a buffer on the fastband.
bufsiz
plzz: 0]
halt
addi n,bufsiz
jumpge n,pla3 ;At end of input file ?
addi sec,BUFSIZ/=32 ;NO
cail sec,BANDSZ ;End of band ?
aoja fb,plx ;Yes.
jrst ply
pla3: close dskchn,0
move n,nwd
setzb fb,sec
;BEGIN MAIN BODY OF PROGRAM
OPEN ADCHN,[117 ;MODE
'AD ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
JRST [MESSAGE[ASCIZ/
***D-A NOT AVAILABLE/]
CALLI 12]
;EXIT IF D-A IS UNAVAILABLE
SPWAR: SPCWAR 17,[CALLI]
MESSAGE [ASCIZ/ GO? /]
READCH A
LOOP: JSP RET,subr ;RxoutINE TO READ AND WRITE
BUF1-1 ;USE BUF1 FOR THE I/O
JUMPLE B,xout ;DONE
JSP RET,subr ;CALL IT AGAIN
BUF2-1 ;USE BUF2 FOR THE I/O
JUMPG B,LOOP ;GO BACK FOR MORE IF B>0
xout: close dskchn, ;END OF PROGRAM.
SPCWAR 0,'SSW'
releas adchn,
jrst lx
;subrRxoutINE TO SET UP IOWD AND READ AND WRITE.
; 1(RET) WILL BE THE RETURN
; 0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
; PUT IN THE RIGHT HALF OF THE IOWD.
; A WILL BE A WORK REGISTER
; B WILL BE TESTED ON THE xoutSIDE.
subr: MOVNI A,BUFSIZ ;PICK UP AND COMPLEMENT BUFSIZ
ADDB A,N ;A←NWD-BUFSIZ
;NWD←NWD-BUFSIZ
MOVE B,A ;SAVE B TO BE TESTED FOR LAST
;TIME.
JUMPL A,LAST ;SET UP FOR LAST TIME.
MOVEI A,0
;THE IOWD LOOKS LIKE:
; [-BUFSIZ / BUFI-1]
LAST: ADDI A,BUFSIZ
MOVNS A ;COMPLEMENT A
HRL A,0(RET) ;PICK UP BUFI AND MOVE IT
;TO THE LEFT SIDE OF A.
hlrzM A,INLIST ;SWAP A AND MOVE IT.
MOVSM A,outWC ;SAME FOR xoutPUT.
movem sec,inlist+2
aos inlist ;Shit.
fbread fb,inlist ;Read a buffer from fast dsk.
halt
OUTPUT ADCHN,OUTWC ;WRITE THE RECORD.
addi sec,BUFSIZ/=32 ;NO
caiGE sec,BANDSZ ;End of band ?
JRST 1(RET) ;RETURN
movei sec,0
aoja fb,1(ret)
; -----------------------------------------
; STORAGE:
NWD: 0 ;FOR NUMBER OF WORDS OF INPUT.
↓BUF1: BLOCK BUFSIZ+1 ;BUFFER 1
BUF2: BLOCK BUFSIZ+1 ;BUFFER 2
FILBLK: 'MUSIC ' ;FILENAME FOR INPUT
'MUS ' ;EXTENSION
0 ;INFORMATION ON FILE
0 ;PROJECT PROG#
FILBL2: 'MUSAA '
'DMD '
0
0
CLIST: IOWD 1,NWD ;FOR THE FIRST RECORD
0
INLIST: 0 ;WILL CONTAIN AN IOWD
bufsiz
0
OUTWC: 0 ;WILL CONTAIN AN IOWD FOR D-A
3650 ;MAGIC BITS FOR 136.
OUTBIT: 4000 ;BITS FOR D-A
BLOCK 2
begin magdsk
A←1
B←2
D←3
OLNG←=4096 ;size of mag tape records. must be multiple of =128.(USE 2342 FOR 360 TAPES)
ichn←adchn
ochn←dskchn
↑START: CALLI 0
INIT ICHN,3B28+17
SIXBIT /MTA0/
0
HALT
MTAPE ICHN,1 ;REWIND THE TAPE
JFCL
INIT OCHN,17
SIXBIT /DSK/
0
HALT
ENTER OCHN,[SIXBIT /MUSIC/
SIXBIT /MUS/
0
0]
HALT
loop:input ichn,olst
statz ichn,20000
jrst xout ;end of tape.
output ochn,olst
jrst loop
OLST: IOWD OLNG,OBUF
0
obuf←← buf1
bend magdsk
end beg